#pragma once

#include "Scene/SceneNodeComponent.h"
#include "Math/Vec3.h"
#include "Math/Quat.h"
#include "Math/BoundingBox.h"
#include "Math/Matrix3x3.h"
#include "RigidBody.m.h"

class RShape;

//一个刚体
//刚体被视为一个能受力的物体
//对于添加刚体组件的节点，其位置和旋转会受到物理引擎的影响
RCLASS()
class WHENGINE_API RRigidBody : public RSceneNodeComponent
{
    ROBJECT
public:

    virtual void OnBeginPlay() override;
    virtual void OnEndPlay() override;

    //质量，永远>0
    float Mass=1;
    
    //设置惯性向量
    void SetInertiaVector(const SVec3& InInertiaVector);
    SVec3 GetInertiaVector() const;

protected:

    //当前的线速度
    SVec3 LinearVelocity;

    //当前的角速度 ，单位为弧度/秒
    //旋转轴为角速度的方向，旋转角度为角速度的模长
    SVec3 AngularVelocity;

    //当前受到的力的总和，单位为牛顿
    SVec3 Force;

    //当前受到的力矩的总和，单位为牛顿米
    SVec3 Torque;

    //惯性向量
    //惯性向量是一个惯性张量的主对角线元素
    //由于惯性张量其他元素可以通过惯性向量和惯性张量的关系计算得到
    //因此只需要存储惯性向量即可
    SVec3 InertiaVector;
    //惯性张量
    //惯性张量是一个3x3的矩阵，描述了物体在不同方向上的惯性
    //惯性张量是一个对称矩阵
    //惯性张量的对角线元素为物体绕着这个轴旋转的惯性
    //惯性张量的非对角线元素为物体绕着这两个轴旋转的惯性
    //惯性张量的单位为kg*m^2
    SMatrix3x3 InertiaTensor;
    //惯性张量的逆
    SMatrix3x3 InertiaTensorInverse;


    friend class RPhysicalScene;

};